﻿//========================================
// All rights reserved (C) 2017-2100
// CLR 版本：	4.0.30319.42000
// 命名空间:	SFJDService
// 文 件 名：	SyncData
// 作    者：	WooG
// 联系方式：	wooglle@163.com
// 创建时间：	2018/3/12 16:01:45
//========================================
using Common;
using SFJDService.SocketHandle;
using System.Threading;

namespace SFJDService
{
    public class SyncData
    {
        public static bool IsSynchronizing = false;
        private ClassActive net_max_user = new ClassActive();
        private ClassActive net_min_user = new ClassActive();

        public SyncData()
        {
            new Thread(() =>
            {
                IsSynchronizing = true;
                Sync();
                IsSynchronizing = false;
                CheckErr();
            }).Start();
        }

        /// <summary>
        /// 将本地数据补齐至网络最大数据
        /// </summary>
        private void Sync()
        {
            //Launcher.SendUdp2All(typeof(PH01GetData).GetDictianaryKey(), "0");
            Launcher.SendMsg2All(typeof(PH01GetData).GetDictianaryKey(), "0");
            Thread.Sleep(3000);
            ClassData local_last = Runtime.xmlData.GetLastData();
            net_max_user = Runtime.UsersOnLine.activeUsers[0];
            net_min_user = Runtime.UsersOnLine.activeUsers[0];
            foreach(ClassActive user in Runtime.UsersOnLine.activeUsers)
            {
                if(user.Data != null && !user.Data.IsEmpty())
                {
                    if(local_last == null || net_max_user.Data.ID < user.Data.ID)
                    {
                        net_max_user = user;
                    }
                    if(local_last == null || net_min_user.Data.ID > user.Data.ID)
                    {
                        net_min_user = user;
                    }
                }
            }
            if(net_max_user.Data != null && net_max_user.Data.ID > net_min_user.Data.ID)
            {
                int start = net_min_user.Data.ID > 0 ? net_min_user.Data.ID + 1: 1;
                int end = net_max_user.Data.ID;
                Broadcast(start, end);
                Thread.Sleep(1000);
                if (Runtime.xmlData.GetLastID() < end)
                {
                    Broadcast(start, end);
                    Thread.Sleep(1000);
                }
            }
            Runtime.UsersOnLine.PrintAllUsers();
            ////////////检查数据是否错误////////////
        }

        /// <summary>
        /// 对net_user_max发送指令要求广播数据
        /// </summary>
        /// <param name="start">起始ID</param>
        /// <param name="end">最大ID</param>
        private void Broadcast(int start, int end)
        {
            for (int i = start; i <= end; i++)
            {
                //SendUdp(typeof(PH01SynGetNetMax).GetDictianaryKey(), net_max_user.Guid, i.ToString());
                //SendUdp(typeof(PH01SynGetNetMax).GetDictianaryKey(), net_max_user.Guid, i.ToString());
                //Launcher.SendTcp(typeof(PH01SynGetNetMax).GetDictianaryKey(), net_max_user.Ip, i.ToString());
                Launcher.SendMsg2One(typeof(PH01SynGetNetMax).GetDictianaryKey(), net_max_user.Guid, i.ToString());
                Thread.Sleep(150);
            }
        }

        /// <summary>
        /// 检查数据是否有错误
        /// </summary>
        public void CheckErr()
        {
            if (!net_max_user.Data.IsEmpty())
            {
                int end = net_max_user.Data.ID;
                int start = end - 20 > 0 ? end - 20 : 1;
                Broadcast(start, end);
            }
        }
    }
}